package cn.green.core.model;

import cn.green.core.components.field.FieldTypeCom;
import cn.green.core.components.store.field.FieldTypeStore;
import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author wang.yishu
 * @version 1.0
 * @className QField
 * @description 字段信息
 * @date 2024/11/12 15:41
 */
@Data
public class QField implements Serializable {
    /**
     * 主键
     */
    protected Integer id;

    /**
     * 所属table的id
     */
    protected Integer tableId;
    /**
     * 数据源名称
     */
    protected String sourceName;
    /**
     * 所属schema
     */
    protected String schemeName;

    /**
     * 所属表名
     */
    protected String tableName;

    /**
     * 字段名称
     */
    protected String fieldName;

    /**
     * 字段别名
     */
    protected String aliasName;

    /**
     * 唯一code
     */
    protected String uniqueCode;

    /**
     * 字段类型 FieldTypeCom
     */
    protected String fieldType;

    /**
     * 字段格式 FieldPatternCom
     */
    protected String fieldForm;

    /**
     * 使用状态
     */
    protected String status;

    /**
     * 字段权限类型
     */
    protected String fieldAuth;

    /**
     * 字段级别
     */
    protected String fieldLevel;

    /**
     * 字段位置
     */
    protected Integer sort;

    public Integer getSort() {
        if (sort == null) {
            return this.id;
        }
        return sort;
    }

    /**
     * 字段校验类型
     */
    protected String fieldCheckJson;
    protected List<String> fieldCheck;

    /**
     * 默认值类型
     */
    protected String defaultType;

    /**
     * 默认值
     */
    protected String defaultValue;

    /**
     * 字段配置
     */
    protected String config;

    /**
     * 删除标识
     */
    protected Integer delStatus;

    /**
     * 新增时间
     */
    protected Date createTime;

    //是否可以被用作查询条件
    protected boolean canBeUsedForCondition = true;

    public boolean canBeInTable() {
        String fieldType = this.getFieldType();
        FieldTypeCom fieldTypeCom = FieldTypeStore.get(fieldType);
        return !fieldTypeCom.isVirtual();
    }

    public List<QField> allFields() {
        List<QField> rtn = new ArrayList<>();
        String fieldType = this.getFieldType();
        FieldTypeCom fieldTypeCom = FieldTypeStore.get(fieldType);
        if (!fieldTypeCom.isVirtual()) {
            rtn.add(this);
        }
        List<QField> extraFields = fieldTypeCom.extraFields(this);
        if (extraFields != null && !extraFields.isEmpty()) {
            rtn.addAll(extraFields);
        }
        return rtn;
    }

    protected String oldFieldName;
    protected String oldAliasName;
    protected String selectColumnName;
    public String getSelectColumnName() {
        if (selectColumnName == null) {
            this.selectColumnName = this.fieldName;
        }
        return selectColumnName;
    }
}
